
# BeautifulSoup   bs4

# 缺点：没有lxml效率高
# 优先：接口人性化

from bs4 import BeautifulSoup

# 解析本地文件

html = BeautifulSoup(open('../files/学成在线.html', encoding='utf-8'), 'lxml')

# print(html)

# 根据标签名查找

# result = html.a  # 第一个a标签  | 找到第一个复合条件的标签
# <a href="./index.html" title="学成在线">学成在线</a>

# result = html.a.attrs  # 获取标签属性名和属性值
# {'href': './index.html', 'title': '学成在线'}



# 函数   建议:组合用

# result = html.find('a')  # 第一个a标签 | 返回第一个复合条件的标签
# <a href="./index.html" title="学成在线">学成在线</a>

# result = html.find('a',title="web") # 根据title找到指定标签 title="web"
# <a href="./index.html" title="web">前端开发</a>

# 找到a标签找到 class = active
# result = html.find('a',class_="active")
# <a class="active" href="./index.html">首页</a>

# find_all 返回的是列表
# result = html.find_all('a')  # 所有a标签

# result = html.find_all('span')  # 所有span标签

# result = html.find_all(['a','span']) # 所有a/span标签

# result = html.find_all('a',limit=3)  # a标签指定数据个数 limit
# [<a href="./index.html" title="学成在线">学成在线</a>, <a class="active" href="./index.html">首页</a>, <a href="./index.html">课程</a>]


# 推荐

# result = html.select('h3')  # 返回所有h3标签
# [<h3 class="title">我的课程表</h3>, <h3 class="title">精品推荐</h3>, <h3>精品推荐</h3>, <h3>前端开发工程师</h3>, <h3>PLC工程师</h3>, <h3>Java开发工程师</h3>]

# result = html.select('.title')  # class = "title" 类选择器
# [<h3 class="title">我的课程表</h3>, <h3 class="title">精品推荐</h3>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>, <h4 class="title">JavaScript数据看板项目实战</h4>]

# result = html.select('#logo')  # id = "logo"

# 属性查找
# result = html.select('h1[id]')  # h1标签带 id的标签

# result = html.select('h1[id="logo"]')  # h1标签带 id的标签 id="logo"
# [<h1 id="logo">
# <a href="./index.html" title="学成在线">学成在线</a>
# </h1>]


# 层级查找

# result = html.select('.sideNavigation li') # 后代选择器

# result = html.select('.sideNavigation > ul > li') # 子代选择器

# [<li><a href="./index.html" title="web">前端开发</a></li>, <li><a href="./index.html">后端开发</a></li>, <li><a href="./index.html">移动开发</a></li>, <li><a href="./index.html">人工智能</a></li>, <li><a href="./index.html">PLC控制</a></li>, <li><a href="./index.html">单片机开发</a></li>, <li><a href="./index.html">云计算&amp;大数据</a></li>, <li><a href="./index.html">产品UI设计</a></li>, <li><a href="./index.html">品牌思维</a></li>]

# 找到a和span标签   可以省略列表[]
# result = html.select('a,span')


# 节点 内容

# id="logo"  内容:学成在线

# result = html.select('#logo')[0].string   # None

# result = html.select('#logo')[0].get_text()  # 学成在线

# 注：只有内容的情况下才能两者使用都可以 string、get_text()
# 若还有其他内容，就只能用 get_text()

# class = "title"
# result = html.select('.title')[0].get_text() # 我的课程表

# id="logo"  获取标签名
# result = html.select('#logo')[0].name  # h1

# result = html.select('#logo')[0].attrs  # {'id': 'logo'}

# 获取节点的属性
# id="logo"  通过id获取class名
# result = html.select('#logo')[0].attrs.get('class')  # ['logo']

# 输出查看
# print(result)
